Skip to content

Wayline: a full-stack ride-hailing sample, its CI and an Initializr template - #5984

Merged
shai-almog merged 126 commits into
masterfrom
wayline-sample
Oct 16, 2026
Merged

shai-almog merged 126 commits into
masterfrom
wayline-sample

Conversation

@shai-almog

Copy link
Copy Markdown
Collaborator

What this is

scripts/wayline is a modern successor to the ride-hailing app of "Create an Uber clone in 14 days": one Maven project in one language, a Codename One app styled with CSS and a Codename One Backend server. The roles the server gives an account decide what it opens on: a rider's map, a driver's screen or an administrator's console. It runs on phones, as a desktop app, and hosted by its own server in a browser.

  • App: sign-in (authorization code + PKCE against the built-in authorization server), phone verification, rider / driver / admin modes, keyless vector maps with routing and proxied place search, wallet and receipts, driver onboarding with documents, admin charts, moderation and pricing, light and dark themes, five languages including RTL, analytics after consent.
  • Server: ORM entities behind repositories, @Transactional services, Flyway-style migrations (per-engine variants where the SQL differs), matching, a ride state machine that settles races in the database, simulated or Stripe payments, a WebSocket live channel.
  • Initializr: offered as a template, kept in step with the sample by scripts/sync-initializr-wayline.py (CI fails on drift). The grub and tweet templates are removed.
  • Developer guide: two chapters, "A ride-hailing app from three sides" and "Building on the sample", covering the structure, moving to PostgreSQL / MySQL and hosting, adding a migration, an external OIDC provider, real SMS, analytics, payments and maps.

Framework changes the sample needed or uncovered

  • cn1:backend-webapp and the Gradle backendWebApp task: build the app for the browser and let the server host it.
  • Shared-contract modules in an app reactor; ResponseStatusException; ConcurrencyFailureException for write conflicts and deadlocks (MariaDB's snapshot isolation reports error 1020 where other engines change no row).
  • Build-time weaving no longer exposes private types in generated code.
  • ParparVM: a receiver that escapes is no longer retired at frame exit (new FrameRetireLiveReceiverIntegrationTest).
  • Vector maps: tile queue with stand-ins and pruning, label collision grid, halos, road hierarchy in light and dark, kinetic pan, zoom about the cursor.
  • JavaScript port: geolocation no longer blocks the EDT waiting for a position that never arrives; asynchronous XHR; coalesced accessibility refresh; released text layers.
  • JavaSE test runner retires each test's threads and listeners; a test process killed by the OS is reported as such instead of "Tests failed".
  • GridLayout preferred height counts implicit rows; GeneralPath grows geometrically; JavaSE mixed-font width uses advances.

Testing

Run locally on the merged tree:

  • Server: 65 tests on the JVM and as a native binary (SQLite). Before the merge, also on PostgreSQL 16 and MySQL 8.4 (JVM and native), MariaDB 10.11 (JVM) and MariaDB 11.8 (JVM and native).
  • Simulator end-to-end: 11/11 on the phone layout and 11/11 on the desktop layout, against screenshots in scripts/wayline/screenshots.
  • Hosted browser app: run-web-e2e.sh in headless Chromium.
  • Initializr: 7/7 tests, template parity, and a generated project that builds and passes its server tests.
  • Before the merge: core unit tests (7,715), build-engine (2,452), Maven plugin (440), Gradle plugin (35), JavaSE port (489), backend (935), with SpotBugs at zero in each and the repository gates passing; the translator suite with the GC verifier clean on the new test.

Not verified:

  • .github/workflows/wayline.yml has never run on GitHub.
  • No Android or iOS device run; map and JavaScript-port screenshot baselines of other suites may need reseeding.
  • Desktop map panning in the browser is not faster than before (tile rasterization on the EDT); zoom is.
  • The external-OIDC section of the guide is design guidance that has not been built end to end.
  • Analytics reaches the cloud console only from a device build.

🤖 Generated with Claude Code

shai-almog and others added 2 commits October 10, 2026 10:11
…emplate

scripts/wayline is one Maven project in one language: a Codename One app
styled with CSS, and a Codename One Backend server. The role the server
gives an account decides what it opens on: a rider's map, a driver's
screen or an administrator's console, on a phone, on the desktop and
hosted by the server itself in a browser.

The server keeps its data in ORM entities behind repositories, with
transactional services and Flyway-style migrations, and runs on SQLite,
PostgreSQL, MySQL and MariaDB. It has sign-in through the built-in
authorization server, phone verification, driver applications, matching,
payments (simulated or Stripe), statistics and a live WebSocket channel.
The app reports usage to Codename One analytics after consent.

Tested like hellocodenameone: server tests on the JVM and as a native
binary, simulator end-to-end tests with screenshots on phone and desktop,
a headless-browser check of the hosted app, and a generated-project check
(.github/workflows/wayline.yml). The Initializr offers it as a template,
kept in step by scripts/sync-initializr-wayline.py, and the developer
guide gains a user's and an implementor's chapter.

Framework changes the sample needed or uncovered:

- cn1:backend-webapp and the Gradle backendWebApp task build the app for
  the browser and let the server host it.
- Shared-module contracts in an app reactor; ResponseStatusException;
  ConcurrencyFailureException for write conflicts and deadlocks, which
  MariaDB's snapshot isolation reports where other engines change no row.
- Build-time weaving no longer exposes private types in generated code.
- ParparVM: a receiver that escapes is no longer retired at frame exit.
- Vector maps: tile queue with stand-ins, label collision grid, halos,
  road hierarchy, kinetic pan, zoom about the cursor.
- JavaScript port: geolocation no longer blocks the EDT waiting for a
  position that never arrives; asynchronous XHR; coalesced accessibility
  refresh; released text layers.
- JavaSE test runner retires each test's threads and listeners, and a
  killed test process is reported as such.
- GridLayout preferred height counts implicit rows; GeneralPath grows
  geometrically; JavaSE mixed-font width uses advances.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@shai-almog

shai-almog commented Oct 10, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 12 screenshots: 12 matched.
✅ JavaSE simulator integration screenshots matched stored baselines.

@shai-almog

Copy link
Copy Markdown
Collaborator Author

@codex review

@github-actions

github-actions Bot commented Oct 10, 2026 •

Copy link
Copy Markdown
Contributor

Developer Guide build artifacts are available for download from this workflow run:

Developer Guide quality checks:

  • AsciiDoc linter: No issues found (report)
  • Vale: No alerts found (report)
  • Paragraph capitalization: No paragraph capitalization issues (report)
  • LanguageTool: No grammar matches (report)
  • Image references: No unused images detected (report)

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 10, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-16T10:28:41.995452Z 9d726a3 Manual request
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@github-actions

Copy link
Copy Markdown
Contributor

Cloudflare Preview

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 6794d2d704

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread CodenameOne/src/com/codename1/maps/MapView.java
Comment thread CodenameOne/src/com/codename1/maps/vector/VectorMapEngine.java
@shai-almog

shai-almog commented Oct 10, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 206 screenshots: 206 matched.
✅ JavaScript-port screenshot tests passed.

@shai-almog

shai-almog commented Oct 10, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 170 screenshots: 170 matched.

Native Android coverage

  • 📊 Line coverage: 16.01% (26002/162390 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 14.37% (122148/850229), branch 9.91% (8466/85441), complexity 7.81% (6525/83503), method 11.59% (4648/40094), class 19.78% (960/4853)
    • Lowest covered classes
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysKt – 0.00% (0/6367 lines covered)
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2384 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.ClassReader – 0.00% (0/1524 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.MethodWriter – 0.00% (0/922 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/736 lines covered)
      • com.google.common.cache.com.google.common.cache.LocalCache$Segment – 0.00% (0/726 lines covered)
      • okio.okio.Buffer – 0.00% (0/687 lines covered)
      • kotlin.text.kotlin.text.StringsKt___StringsKt – 0.00% (0/625 lines covered)
      • com.codename1.androidcompat.rt.com.codename1.androidcompat.rt.TextXmlPullParser – 0.00% (0/623 lines covered)
      • com.codename1.androidcompat.androidx.constraintlayout.core.widgets.com.codename1.androidcompat.androidx.constraintlayout.core.widgets.Flow – 0.00% (0/576 lines covered)

✅ Native Android screenshot tests passed.

Native Android coverage

  • 📊 Line coverage: 16.01% (26002/162390 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 14.37% (122148/850229), branch 9.91% (8466/85441), complexity 7.81% (6525/83503), method 11.59% (4648/40094), class 19.78% (960/4853)
    • Lowest covered classes
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysKt – 0.00% (0/6367 lines covered)
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2384 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.ClassReader – 0.00% (0/1524 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.MethodWriter – 0.00% (0/922 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/736 lines covered)
      • com.google.common.cache.com.google.common.cache.LocalCache$Segment – 0.00% (0/726 lines covered)
      • okio.okio.Buffer – 0.00% (0/687 lines covered)
      • kotlin.text.kotlin.text.StringsKt___StringsKt – 0.00% (0/625 lines covered)
      • com.codename1.androidcompat.rt.com.codename1.androidcompat.rt.TextXmlPullParser – 0.00% (0/623 lines covered)
      • com.codename1.androidcompat.androidx.constraintlayout.core.widgets.com.codename1.androidcompat.androidx.constraintlayout.core.widgets.Flow – 0.00% (0/576 lines covered)

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend scalar fallback (no native SIMD)
SIMD int-add (64K x300) java 422ms / native 207ms = 2.0x speedup
SIMD float-mul (64K x300) java 419ms / native 172ms = 2.4x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 86.000 ms
Base64 CN1 decode 84.000 ms
Base64 native encode 435.000 ms
Base64 encode ratio (CN1/native) 0.198x (80.2% faster)
Base64 native decode 266.000 ms
Base64 decode ratio (CN1/native) 0.316x (68.4% faster)
Image encode benchmark status skipped (SIMD unsupported)

@github-actions

github-actions Bot commented Oct 10, 2026 •

Copy link
Copy Markdown
Contributor

✅ Continuous Quality Report

Test & Coverage

Static Analysis

  • SpotBugs [Report archive]
    • ✅ ByteCodeTranslator: 0 findings (no issues)
    • ✅ android: 0 findings (no issues)
    • ✅ android-compat: 0 findings (no issues)
    • ✅ android-res-compiler: 0 findings (no issues)
    • ✅ backend: 0 findings (no issues)
    • ✅ backend-test: 0 findings (no issues)
    • ✅ build-engine: 0 findings (no issues)
    • ✅ build-hint-catalog: 0 findings (no issues)
    • ✅ build-hint-tools: 0 findings (no issues)
    • ✅ codenameone-gradle-plugin: 0 findings (no issues)
    • ✅ codenameone-maven-plugin: 0 findings (no issues)
    • ✅ core-unittests: 0 findings (no issues)
    • ✅ ios: 0 findings (no issues)
    • ✅ javac: 0 findings (no issues)
    • ✅ project-model: 0 findings (no issues)
  • ✅ PMD: 0 findings (no issues) [Report archive]
  • ✅ Checkstyle: 0 findings (no issues) [Report archive]

Generated automatically by the PR CI workflow.

@shai-almog

shai-almog commented Oct 10, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 185 screenshots: 185 matched.
Native Windows port (x64 / Intel-AMD): full hellocodenameone screenshot suite rendered offscreen with Direct2D/DirectWrite, plus the real benchmarks (base64 native/CN1/SIMD, image createMask/applyMask/modifyAlpha/PNG/JPEG, SSE2 SIMD kernels). Compared against the in-repo baseline in scripts/windows/screenshots.

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 44ms / native 2ms = 22.0x speedup
SIMD float-mul (64K x300) java 43ms / native 3ms = 14.3x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 native bridge unavailable (CN1 + SIMD + image benchmarks only)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 60.000 ms
Base64 CN1 decode 72.000 ms
Base64 SIMD encode 94.000 ms
Base64 encode ratio (SIMD/CN1) 1.567x (56.7% slower)
Base64 SIMD decode 76.000 ms
Base64 decode ratio (SIMD/CN1) 1.056x (5.6% slower)
Image encode benchmark iterations 100
Image createMask (SIMD off) 8.000 ms
Image createMask (SIMD on) 4.000 ms
Image createMask ratio (SIMD on/off) 0.500x (50.0% faster)
Image applyMask (SIMD off) 27.000 ms
Image applyMask (SIMD on) 23.000 ms
Image applyMask ratio (SIMD on/off) 0.852x (14.8% faster)
Image modifyAlpha (SIMD off) 24.000 ms
Image modifyAlpha (SIMD on) 16.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.667x (33.3% faster)
Image modifyAlpha removeColor (SIMD off) 32.000 ms
Image modifyAlpha removeColor (SIMD on) 15.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.469x (53.1% faster)

ParparVM vs HotSpot (JDK 25): Windows x64

Runner CPU: AMD64 Family 25 Model 17 Stepping 1, AuthenticAMD (baseline windows-x64@amd64-family-25-model-17-authenticamd)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 15% (time) / 15% (RAM) away from its baseline in vm/selfhost/perf-baseline/ fails: above it is a regression, below it an improvement that has to be rebaselined (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (WinHelloMain) 4 1.36x (base 1.38x, -1.4%) 1.02x (base 1.09x, -6.9%) ok
translator (self) 4 0.79x (base 0.70x, +12.3%) 0.53x (base 0.55x, -4.6%) ok
intArithmetic 4 1.10x (base 1.10x, +0.5%) 0.05x (base 0.06x, -3.0%) ok
longArithmetic 4 1.08x (base 1.08x, -0.0%) 0.05x (base 0.06x, -1.1%) ok
mathTranscendental 4 0.85x (base 0.85x, +0.4%) 0.06x (base 0.06x, +1.6%) ok
arraySequential 4 1.76x (base 1.72x, +2.2%) 0.38x (base 0.38x, +0.2%) ok
arrayRandom 4 1.02x (base 1.01x, +0.3%) 0.23x (base 0.23x, +0.2%) ok
objectAllocation 4 1.28x (base 1.25x, +2.3%) 0.28x (base 0.29x, -4.9%) ok
valueEscape 4 0.10x (base 0.10x, -1.3%) 0.05x (base 0.04x, +1.3%) ok
hashMapChurn 4 1.30x (base 1.39x, -6.8%) 0.10x (base 0.10x, +1.2%) ok
stringBuilding 4 1.39x (base 1.36x, +2.1%) 0.27x (base 0.28x, -3.5%) ok
recursion 4 1.38x (base 1.43x, -3.3%) 0.06x (base 0.06x, +0.6%) ok
quicksort 4 1.07x (base 1.11x, -4.0%) 0.12x (base 0.12x, -0.3%) ok

Result: no regression

Gradle: a project in Java and Kotlin failed in compileJava with two copies
of one generated mapper. Kotlin's pass compiles the Java it has not seen
yet only to resolve types, and that output was read as a dependency's, so a
@mapped Java class was mapped by both passes. AnnotationProcessing now takes
the class directories that are the module's own and offers nothing out of
them.

wayline.yml: the simulator job runs in the pr-ci-container image and the
workflow could not pull it without packages: read.

Sample server:
- A refund is refused while a tip on the ride is still being charged, so a
  tip can no longer land on a ride that was refunded without it.
- A ride left completed with its payment pending is settled by a scheduled
  pass; settling is safe to repeat.
- The card limit is enforced where a card is saved, not only where a setup
  starts.
- Two registrations racing for one e-mail answer 409, not a server error.
- Changing an account's roles closes the live channel it has open.

Sample client: tokens are stored under a name made from the server's
address, and cleared when the address changes, so one server's tokens are
never sent to another.

Maps: a map removed while gliding is taken off the form that animates it,
and a failed tile is asked for again when its delay runs out, without
waiting for something else to repaint the map.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@shai-almog

shai-almog commented Oct 10, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 185 screenshots: 185 matched.
Native Windows port (arm64 / Apple Silicon - Arm): full hellocodenameone screenshot suite rendered offscreen with Direct2D/DirectWrite, plus the real benchmarks (base64 native/CN1/SIMD, image createMask/applyMask/modifyAlpha/PNG/JPEG, NEON SIMD kernels). Compared against the in-repo baseline in scripts/windows/screenshots.

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 54ms / native 3ms = 18.0x speedup
SIMD float-mul (64K x300) java 54ms / native 3ms = 18.0x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 native bridge unavailable (CN1 + SIMD + image benchmarks only)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 60.000 ms
Base64 CN1 decode 70.000 ms
Base64 SIMD encode 77.000 ms
Base64 encode ratio (SIMD/CN1) 1.283x (28.3% slower)
Base64 SIMD decode 73.000 ms
Base64 decode ratio (SIMD/CN1) 1.043x (4.3% slower)
Image encode benchmark iterations 100
Image createMask (SIMD off) 6.000 ms
Image createMask (SIMD on) 1.000 ms
Image createMask ratio (SIMD on/off) 0.167x (83.3% faster)
Image applyMask (SIMD off) 18.000 ms
Image applyMask (SIMD on) 20.000 ms
Image applyMask ratio (SIMD on/off) 1.111x (11.1% slower)
Image modifyAlpha (SIMD off) 19.000 ms
Image modifyAlpha (SIMD on) 13.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.684x (31.6% faster)
Image modifyAlpha removeColor (SIMD off) 21.000 ms
Image modifyAlpha removeColor (SIMD on) 14.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.667x (33.3% faster)

ParparVM vs HotSpot (JDK 25): Windows arm64

Runner CPU: ARMv8 (64-bit) Family 8 Model D49 Revision 0, MICROSOFT CORPORATION (baseline windows-arm64@armv8-64-bit-family-8-model-d49-microsoft-corporation)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 15% (time) / 15% (RAM) away from its baseline in vm/selfhost/perf-baseline/ fails: above it is a regression, below it an improvement that has to be rebaselined (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (WinHelloMain) 4 1.01x (base 1.11x, -8.8%) 0.94x (base 1.28x, -26.5%) ok
translator (self) 4 0.86x (base 0.84x, +2.6%) 0.51x (base 0.51x, -0.9%) ok
intArithmetic 4 1.04x (base 1.04x, -0.0%) 0.06x (base 0.06x, +1.4%) ok
longArithmetic 4 0.79x (base 0.80x, -0.3%) 0.06x (base 0.06x, +1.8%) ok
mathTranscendental 4 0.71x (base 0.72x, -1.1%) 0.06x (base 0.06x, +0.2%) ok
arraySequential 4 0.36x (base 0.46x, -21.5%) 0.39x (base 0.39x, -0.1%) ok
arrayRandom 4 0.94x (base 0.94x, +0.1%) 0.23x (base 0.23x, +0.0%) ok
objectAllocation 4 1.82x (base 2.81x, -35.3%) 0.33x (base 0.43x, -22.9%) ok
valueEscape 4 0.76x (base 0.76x, +0.0%) 0.05x (base 0.05x, +1.5%) ok
hashMapChurn 4 0.99x (base 0.98x, +0.5%) 0.11x (base 0.12x, -7.8%) ok
stringBuilding 4 1.56x (base 1.43x, +9.7%) 0.27x (base 0.27x, -0.1%) ok
recursion 4 1.44x (base 1.46x, -1.7%) 0.06x (base 0.07x, -0.3%) ok
quicksort 4 1.01x (base 1.00x, +0.7%) 0.12x (base 0.12x, -0.0%) ok

Result: no regression

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 10, 2026 •

Copy link
Copy Markdown
Contributor

✅ ByteCodeTranslator Quality Report

Test & Coverage

  • ✅ Tests: 812 total, 0 failed, 57 skipped

Benchmark Results

  • Execution Time: 7514 ms

  • Hotspots (Top 20 sampled methods):

    • 8.99% com.codename1.tools.translator.IteratorEscape.ctorOnlyStoresParamsIntoThis (101 samples)
    • 7.74% java.lang.System.identityHashCode (87 samples)
    • 6.41% com.codename1.tools.translator.BytecodeMethod.equals (72 samples)
    • 6.14% java.util.ArrayList.indexOf (69 samples)
    • 4.27% com.codename1.tools.translator.IteratorEscape.mangle (48 samples)
    • 2.67% java.lang.Object.hashCode (30 samples)
    • 2.58% java.util.AbstractCollection.containsAll (29 samples)
    • 2.49% java.lang.StringBuilder.append (28 samples)
    • 2.14% com.codename1.tools.translator.BytecodeMethod.updateInlinableFieldDependencies (24 samples)
    • 2.05% com.codename1.tools.translator.classfile.analysis.Frame.execute (23 samples)
    • 1.78% com.codename1.tools.translator.NativeSymbolIndex.<init> (20 samples)
    • 1.78% com.codename1.tools.translator.IteratorEscape.walk (20 samples)
    • 1.78% com.codename1.tools.translator.JavascriptReachability.enqueueResolved (20 samples)
    • 1.78% java.lang.String.equals (20 samples)
    • 1.60% com.codename1.tools.translator.bytecodes.Invoke.findMethodUp (18 samples)
    • 1.42% java.io.FileOutputStream.writeBytes (16 samples)
    • 1.33% java.io.FileOutputStream.open0 (15 samples)
    • 1.33% com.codename1.tools.translator.Parser.cullMethods (15 samples)
    • 1.33% com.codename1.tools.translator.ByteCodeClass.hasDeclaredMethod (15 samples)
    • 1.25% com.codename1.tools.translator.classfile.analysis.Frame.merge (14 samples)
  • ⚠️ Coverage report not generated.

Static Analysis

  • ✅ SpotBugs: no findings (report was not generated by the build).
  • ⚠️ PMD report not generated.
  • ⚠️ Checkstyle report not generated.

Generated automatically by the PR CI workflow.

shai-almog and others added 3 commits October 10, 2026 21:58
The vector map engine draws differently on this branch, so the four map
screenshots are reseeded from this branch's CI captures.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ght up

The JavaScript port on this branch brings the ARIA overlay up to date after
the screen goes quiet rather than on every change, so a bounds read 150ms
after a wheel event could still describe the list part way through the
scroll, and the click then selected a different sample.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…S 27 map baselines

build-ios-app.sh checked that MAVEN_HOME holds a Maven and then ran ./mvnw
regardless, so the Wayline iOS job failed with 'No such file or directory'.
It now uses the application's wrapper where there is one and that Maven
otherwise, as build-android-app.sh does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@shai-almog

shai-almog commented Oct 11, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 163 screenshots: 163 matched.
✅ Native Apple TV (tvOS, Metal) screenshot tests passed.

shai-almog and others added 3 commits October 11, 2026 07:51
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ed the macOS map baselines

A name that follows a bend is drawn a straight stretch at a time. The
stretches were laid out by each letter's width measured on its own, which
a font with kerning sets wider than the same letters drawn together, so
on iOS and Mac Catalyst a name read "Bro adway" where the road turned.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@shai-almog

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e18980f1b5

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@shai-almog

shai-almog commented Oct 11, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 185 screenshots: 185 matched.
Native Windows port, REAL shipping pipeline: the hellocodenameone screenshot suite rendered by a binary CROSS-COMPILED on Linux (clang-cl + xwin, WebView2 linked) and RUN on a Windows x64 runner. Compared against the in-repo baseline in scripts/windows/screenshots.

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 53ms / native 4ms = 13.2x speedup
SIMD float-mul (64K x300) java 53ms / native 4ms = 13.2x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 native bridge unavailable (CN1 + SIMD + image benchmarks only)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 70.000 ms
Base64 CN1 decode 87.000 ms
Base64 SIMD encode 98.000 ms
Base64 encode ratio (SIMD/CN1) 1.400x (40.0% slower)
Base64 SIMD decode 91.000 ms
Base64 decode ratio (SIMD/CN1) 1.046x (4.6% slower)
Image encode benchmark iterations 100
Image createMask (SIMD off) 8.000 ms
Image createMask (SIMD on) 5.000 ms
Image createMask ratio (SIMD on/off) 0.625x (37.5% faster)
Image applyMask (SIMD off) 30.000 ms
Image applyMask (SIMD on) 30.000 ms
Image applyMask ratio (SIMD on/off) 1.000x (0.0% slower)
Image modifyAlpha (SIMD off) 33.000 ms
Image modifyAlpha (SIMD on) 24.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.727x (27.3% faster)
Image modifyAlpha removeColor (SIMD off) 35.000 ms
Image modifyAlpha removeColor (SIMD on) 33.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.943x (5.7% faster)

@shai-almog

shai-almog commented Oct 11, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 185 screenshots: 185 matched.
Native Linux port (x64), GTK3/Cairo/Pango, ParparVM bytecode-to-C (no JVM): the hellocodenameone screenshot suite rendered by a native ELF built + run on the GitHub x64 runner. Baseline: scripts/linux/screenshots.

ParparVM vs HotSpot (JDK 25): Linux x64

Runner CPU: AMD EPYC 9V45 96-Core Processor (baseline linux-x64@amd-epyc-9v45-96-core-processor)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 15% (time) / 15% (RAM) away from its baseline in vm/selfhost/perf-baseline/ fails: above it is a regression, below it an improvement that has to be rebaselined (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (LinuxHelloMain) 4 0.97x (base 0.95x, +1.4%) 0.96x (base 0.86x, +11.3%) ok
translator (self) 4 0.60x (base 0.64x, -6.6%) 0.49x (base 0.45x, +7.6%) ok
intArithmetic 4 1.00x (base 1.00x, -0.0%) 0.07x (base 0.07x, -1.7%) ok
longArithmetic 4 0.99x (base 0.99x, -0.0%) 0.07x (base 0.07x, -1.6%) ok
mathTranscendental 4 1.20x (base 1.19x, +0.4%) 0.06x (base 0.08x, -23.7%) ok
arraySequential 4 2.92x (base 3.38x, -13.7%) 0.36x (base 0.36x, -0.1%) ok
arrayRandom 4 1.04x (base 1.02x, +1.8%) 0.21x (base 0.21x, -0.1%) ok
objectAllocation 4 1.60x (base 1.61x, -0.6%) 0.28x (base 0.24x, +17.3%) ok
valueEscape 4 0.10x (base 0.10x, +1.0%) 0.04x (base 0.04x, +2.0%) ok
hashMapChurn 4 1.23x (base 1.21x, +1.7%) 0.09x (base 0.09x, -2.6%) ok
stringBuilding 4 1.56x (base 1.56x, +0.2%) 0.26x (base 0.26x, -0.0%) ok
recursion 4 1.32x (base 1.35x, -2.1%) 0.08x (base 0.07x, +0.9%) ok
quicksort 4 1.07x (base 1.06x, +1.7%) 0.13x (base 0.11x, +15.4%) ok

Result: no regression

@shai-almog

shai-almog commented Oct 11, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 185 screenshots: 185 matched.
Native Linux port (arm64), GTK3/Cairo/Pango, ParparVM bytecode-to-C (no JVM): the hellocodenameone screenshot suite rendered by a native ELF built + run on the GitHub arm64 runner. Baseline: scripts/linux/screenshots-arm.

ParparVM vs HotSpot (JDK 25): Linux arm64

Runner CPU: Neoverse-N2 (baseline linux-arm64@neoverse-n2)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 15% (time) / 15% (RAM) away from its baseline in vm/selfhost/perf-baseline/ fails: above it is a regression, below it an improvement that has to be rebaselined (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (LinuxHelloMain) 4 0.95x (base 0.93x, +2.2%) 0.96x (base 1.01x, -5.2%) ok
translator (self) 4 0.72x (base 0.70x, +3.4%) 0.50x (base 0.51x, -2.1%) ok
intArithmetic 4 1.04x (base 1.04x, -0.0%) 0.03x (base 0.03x, -1.7%) ok
longArithmetic 4 0.79x (base 0.79x, -0.1%) 0.03x (base 0.03x, -1.3%) ok
mathTranscendental 4 1.10x (base 1.10x, +0.0%) 0.03x (base 0.03x, +0.7%) ok
arraySequential 4 0.36x (base 0.36x, -1.2%) 0.37x (base 0.37x, +0.3%) ok
arrayRandom 4 0.93x (base 0.94x, -0.4%) 0.20x (base 0.20x, +0.1%) ok
objectAllocation 4 1.94x (base 1.77x, +9.6%) 0.37x (base 0.38x, -2.4%) ok
valueEscape 4 0.51x (base 0.51x, -0.1%) 0.03x (base 0.03x, -0.1%) ok
hashMapChurn 4 0.85x (base 0.84x, +0.7%) 0.12x (base 0.12x, -2.7%) ok
stringBuilding 4 1.39x (base 1.57x, -11.1%) 0.26x (base 0.26x, -0.5%) ok
recursion 4 1.42x (base 1.43x, -1.1%) 0.03x (base 0.04x, -3.9%) ok
quicksort 4 1.00x (base 0.99x, +0.5%) 0.09x (base 0.09x, +0.9%) ok

Result: no regression

shai-almog and others added 2 commits October 11, 2026 09:31
- A charge that fails without the processor saying whether it took the
  money leaves the ride pending and is asked for again under the same key;
  only a refused card is a failed payment. The same for a tip, which stays
  on the ride and can be sent again with the same amount.
- A rider's two requests and two rides choosing one driver now take turns
  on the rider's and the driver's row, so neither ends in two rides.
- The limit on guesses at a phone code is applied by the statement that
  counts the guess.
- The driver role is not withdrawn from a driver who is on a ride.
- A reconnect timer left over from before the live channel was restarted
  no longer opens a second connection.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…wo prose fixes

The template check built the generated app with no display, and the theme
compiler opens a window; it now takes a virtual display from xvfb-run on a
Linux machine without one, as server.sh does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… mode says so to the server

Closing an account is refused while the driver's earnings balance is above
zero, since the retired name could never cash it out. Leaving the driver's
side while the session is still there reports the driver off line, and a
driver-status answer arriving after navigation no longer restarts the shift.
Sign-out revocation and charges past the retry window are left as they are,
and the code says why.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@shai-almog

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: c4d1a2c28e

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

…he settlement sweep takes the oldest rides first

A save answered after another account signed in no longer erases that
account's unsent mark. The payment sweep reads its page oldest first, so a
backlog cannot keep old rides behind new ones until they age out. A stale
account load still completes, and the JavaScript port's XHR listeners are
plain worker closures freed with the request; the code says why.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@shai-almog

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 5a6d08a8da

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread CodenameOne/src/com/codename1/maps/vector/VectorMapEngine.java
…very piece of it

The failure of a level fetched for overzoomed pieces was recorded only
against the pieces then waiting, so each further piece of the same tile --
one per sibling within a paint when the source refuses at once, or every
piece a pan brings into view -- asked the source for it again with no
back-off. It is now recorded under the ancestor's own key and consulted
before the ancestor is asked for.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@shai-almog

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 6d53e8a4e8

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

… the outer build's profiles

The demo fortnight's card tips had no tip reference, so the driver's
earnings and a refund skipped them while the receipts showed them. The
nested JavaScript build of backend-webapp now receives the profiles turned
on and off with -P. The demo seeding marker stays an account, and the code
says why.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@shai-almog

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b7a3f81a09

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread vm/JavaAPI/src/java/net/URLDecoder.java
…ting one each

A callback handed to the page keeps an entry in the runtime's worker
callback table for good, so a new GeoCallback per getCurrentLocation and
per watch was never released. The manager now owns one callback for
one-shot answers, taken by whoever is waiting, and one for watches.
URLDecoder leaves an unknown encoding to the first escape, and the code
says why.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@shai-almog

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 9c125f4818

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

… holds the profile first

A tip for a ride whose driver has closed the account is refused, since it
would be credited to a name nobody can cash out. A guess at the phone code
takes the profile hold before the code row, the order a closure takes
them in. Withdrawing the driver role with earnings owed stays allowed, and
the code says why.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@shai-almog

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

if (compiler != null && compiler.getConfiguration() instanceof Xpp3Dom) {
Xpp3Dom encoding = ((Xpp3Dom) compiler.getConfiguration()).getChild("encoding");

P2 Badge Honor execution-level source encodings

When a module sets <encoding> in the active maven-compiler-plugin compile execution instead of the plugin-level configuration, Maven's lifecycle compiles with that encoding, but this reads only compiler.getConfiguration() and falls back to a property or UTF-8. The backend packager then recompiles the same sources using a different charset, so non-ASCII source can fail packaging or produce different identifiers and string literals; resolve encoding from the same active compiler execution already selected for the other compiler options.

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread vm/JavaAPI/src/java/net/URLEncoder.java
…n first

backend-package and backend-test recompile the module's sources, and took
their encoding from the compiler plugin's own configuration only, so a
module declaring <encoding> on its compile execution was recompiled with a
different charset than the lifecycle used. The execution already selected
for the other compiler options is now read first. The tip-in-flight comment
is corrected, and URLEncoder says why an unknown encoding waits for the
first escape.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@shai-almog

Copy link
Copy Markdown
Collaborator Author

@codex review

…e says why

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 445229cfd0

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Window.setTimeout handed every Java handler a permanent worker callback
id, and the host kept a proxy for it, so each timeout leaked both. A
one-shot timer now forgets both sides when it fires or is cleared, and
the semantic-refresh timer reuses one stable handler.

A browser bundle with a link back to its own ancestor is refused when
the link is reached instead of being copied into itself. The Gradle
task's comment now points at the never-up-to-date registration, and the
duplicate of that registration is gone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@shai-almog

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. You're on a roll.

Reviewed commit: 9d726a3d6a

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@shai-almog
shai-almog merged commit eda1b10 into master Oct 16, 2026
shai-almog added a commit that referenced this pull request Oct 16, 2026
…4 translator)

#5984 (merged) rebaselines the same two rows from the same values, which the
baseline checker rejects. Its rows stay; this PR's getCallers memory
improvement on those two runners is re-measured on top of both from the
next CI run.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
shai-almog added a commit that referenced this pull request Oct 17, 2026
…baselines

Both rows were rebaselined from the value master's overlays had already moved, which
the resolver refuses as two changes that did not see each other. They now start from
the merged result and keep its time and tolerances; only memory is ours.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
shai-almog added a commit that referenced this pull request Oct 17, 2026
…ainder, detach release

- ContactFilter2D: a trigger is never filtered by the normal angle, as
  Unity documents for useTriggers.
- Mathf.Abs(int) goes through System.Math.Abs: Unity documents a
  non-negative result, which the smallest int cannot have.
- Rigidbody2D.mass refuses a value that is not positive, so the property
  and the simulation agree.
- A looping ParticleSystem keeps the time a step runs past its end and
  fires the bursts of every cycle the step crosses.
- GameView lets go of the on-screen controls and the pointer when it is
  detached in the middle of a touch.
- The Unity gallery prebuilt cache key hashes the whole plugin,
  build-engine and project-model.
- Comments record why String.Split with one null separator and the
  fixed default Random seed stay as they are.
- perf: macOS objectAllocation RAM recorded on top of #5984's row.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
shai-almog added a commit that referenced this pull request Oct 21, 2026
* Run Unity 2D projects as Codename One applications

A Unity project's Assets and ProjectSettings in common/src/main/unity build
unmodified: the .NET SDK compiles the C# scripts, maven/cil-translator turns
the assembly into Java class files and compiles every scene, prefab,
animator controller, clip, tile map and particle system to reflection-free
Java, and maven/unity-compat is the runtime they run against (a .NET base
library, the UnityEngine API over com.codename1.gaming, and our own
TextMesh Pro and Cinemachine implementations). Maven (compile-unity,
import-unity-project) and Gradle (compileUnity) share UnityProjectBuilder.
Both modules sit behind the unity-compat profile and are published by the
release.

Float results have to match C# on every target, so native builds get
-ffp-contract=off and the JavaScript target rounds float results with
Math.fround.

Bugs this uncovered and fixes outside the new modules, each with a test:
- ParparVM JavaScript: wide stack shuffles, MULTIANEWARRAY dimension pops,
  a call result compared with FCMP/DCMP evaluated more than once, SWAP
  losing the lower value.
- ParparVM native: arraycopy/clone of an array of primitive arrays took
  the primitive path.
- GameView: a key repeat released a held key; a focused hosted child kept
  the multi-touch arrays from the view.
- Box2D: chain against chain threw in World.popContact; the broad phase
  allocated a merge buffer on every step above 31 pairs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity project test: hide dotnet without dropping its directory; arm64 perf baseline

On the Ubuntu runner dotnet is linked into /usr/bin, so dropping every PATH
directory that holds it also dropped env, bash and mvn. The directory is now
shadowed by links to everything in it except dotnet.

objectAllocation RAM on Neoverse-N2 is bimodal; the row is recalibrated from
this run and three master runs with a wider RAM tolerance. No improvement is
claimed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: review findings, JavaScript numeric fixes, chart transform

Review findings (rationale for the ones left alone is in comments at the
code concerned):
- Install the view's services (PlayerPrefs store, audio, platform) before
  the first scene wakes.
- A coroutine started from Start or Update resumes its first null yield on
  the next frame.
- Time.timeSinceLevelLoad restarts on a scene load.
- Application.platform and isMobilePlatform come from the host platform.
- Signed division and remainder of MinValue by -1 throw OverflowException,
  as does System.Math.Abs of MinValue.

JavaScript screenshots: XYChart rotated the canvas and rotated it back,
which with float-rounded angles leaves a transform 1e-14 off identity, and
the JavaScript port draws DOM text only for an exact identity. XYChart and
ChartComponent now restore the transform they were handed, and the port's
DOM text decision tolerates that residue.

A differential fixture against the JVM found four older JavaScript target
bugs: int to float/double read an un-normalized int, float/double to int
wrapped instead of saturating, a static read before its first write was
undefined, and Float.toString printed the double.

The offscreen check now runs on every scene sample in the integration
test. It found: a flick release delivered at the press point because
CodenameOneImplementation aliased the shared pointer arrays, GameView
missing single finger presses after the first drag, and a sub-image cache
keyed by corner only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: reseed six JavaScript theme goldens, keep CodeQL off the numeric fixture

The JavaScript target now truncates a float product the way the JVM does, so
the six theme screens that size from one move by a pixel; the goldens are this
run's CI captures. JsNumericDifferentialApp compares narrowing compound
assignments against the JVM on purpose and joins the other compiler fixtures
CodeQL does not read.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity guide: Application.platform, isMobilePlatform and timeSinceLevelLoad

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: second review round, macOS gradient golden, x64 perf baseline

Base library: LINQ operators dispose their enumerators on every exit, Enum
values keep their underlying type and unsigned order, Enum.Parse takes comma
lists, HasFlag/CompareTo/IsDefined refuse another enum's member, String.Format
rejects a lone closing brace, Trim follows Char.IsWhiteSpace, typeof(int) and
typeof(uint) are distinct, a float key's two zeros are one key, and a Java
exception thrown by the runtime is caught by a script's catch (Exception).
AudioSource.time seeks the device's media and accounts for pitch.

The macOS draw-gradient golden is this branch's CI capture: with
-ffp-contract=off the mutable-image ellipse edge now equals the on-screen one.

Linux x64 perf baseline rows recalibrated per runner CPU from PR and master
runs; the shift is present on master at the base commit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: third review round

Text images are released when a label stops showing them: the core sprite
renderer gains releaseTexture, and the Unity view's text cache is bounded.
yield return of a bare IEnumerator runs the child before the parent resumes.
Time's unscaled values follow the fixed step inside FixedUpdate.
List and Dictionary copy constructors. GameObject.Find walks a path.
GetComponentInChildren always searches the object asked. Char.IsDigit covers
the Unicode decimal digits. Two scripts with one file name are told apart by
their source path. The incremental build stamp hashes content and holds no
times or absolute paths, so a built project can move between machines.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: screenshot tests in the hellocodenameone suite

A gallery project of eight scenes, one per feature area, is compiled into the
test app; each test advances a held clock a fixed number of frames and
captures. scripts/unity-gallery-prebuilt.sh packs the translated project so
a job without the .NET SDK can build the app.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: transpile the screenshot gallery once on Linux for every port

unity-gallery-prebuilt.yml builds the pack behind a cache and uploads it;
every workflow that builds the hellocodenameone app unpacks it before the
build, so no macOS, Windows or Android job needs the .NET SDK. A consumer job
in unity-compat.yml holds the no-SDK path. A build whose compiled output does
not match its sources or jars now says so.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: give every hand-assembled translation the runtime, fix the pack digest

Linux, Windows and JavaScript builds of the test app listed their class
directories by hand and never saw a dependency jar; the common module now
stages its runtime class path where they read it. The compile-unity tool
class path took the translator's test dependencies, so the pack's digest
covered the consumer's own core jar; it is runtime scope now, and a mismatch
names the part and the first entry that differs. The eight Unity tests are a
port-status feature.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* GPU: the framebuffer's alpha accumulates coverage on every backend

The Unity gallery's Canvas scene has a panel that is black at 40% over the
camera's background. Android and Windows rendered 0.6 x background; Linux
rendered it LIGHTER than the background and JavaScript a third too light.

Both used one glBlendFunc(SRC_ALPHA, ONE_MINUS_SRC_ALPHA) for all four
channels, so the frame's alpha became sa*sa + (1-sa) = 0.76 under the panel.
The colour was right; the frame was then composited with that alpha -- by
cairo over the form on Linux, as a premultiplied canvas on JavaScript.

The alpha channel now takes ONE / ONE_MINUS_SRC_ALPHA on Linux, JavaScript,
Android, JavaSE (JOGL) and Metal, which is what Direct3D already did, and
RenderState.BlendMode documents it. The JavaSE software device weights
additive light by the source alpha, as every GPU backend does.

GpuBlendContractTest runs the blend equation with each backend's factors;
parparvm-tests.yml names the sources it reads. The offscreen scene check
asserts the panel against the background.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Native Linux and Windows: a native: font keeps the style its name asks for

The Unity gallery's TextMeshPro scene draws a bold and an italic line, and
both came out in the regular face on native Linux and Windows. The runtime
asks the portable way -- createTrueTypeFont("native:MainBold", ...)
.derive(px, STYLE_PLAIN) -- so the style is in the name alone.

Linux mapped every native: name to regular Sans. Windows read the style at
load and then rebuilt the derived font from derive's weight only. Both now
keep it; graphics-draw-string on those ports draws its MainBold, MainBlack
and Italic* lines styled for the first time and will need reseeding.

NativeFontStyleContractTest compiles the two name parsers alone and holds
the derive paths by source; parparvm-tests.yml names the files it reads.

Also: the complete license header on four files the blend fix touched, and
the Unity gallery goldens for Android and JavaScript, plus the six scenes
without text for Linux (x64, arm64) and Windows, from CI run captures.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: paint text on the event dispatch thread, wherever the frame runs

A text command was painted on the frame's thread. On iOS that is the main
thread, while the port keeps one "image being drawn into" for the whole
process: a component painted to the screen meanwhile ends it, and a string
on its way to the text's image is dropped silently. A text is painted once
and cached, so a line lost that way never came back -- the right-aligned
line of the TextMeshPro gallery scene, in the iOS capture.

A frame off the event dispatch thread now asks it for the text by
callSerially and never waits; the pixels come back as an RGBImage. Until
they arrive a label shows its previous text. A frame on the event dispatch
thread paints at once, as before.

SceneShots.checkOffEdt holds the event dispatch thread and draws frames
off it for every gallery scene; the offscreen checks that assert a whole
frame now draw it on the event dispatch thread.

Also: Unity goldens for iOS (Metal, newest runtime) and the Canvas and
TextMeshPro scenes on Linux and Windows; reseeds on Linux and Windows for
the screens whose native: bold and italic fonts are now honoured; and a
recalibrated Windows x64 translator row in the PR's perf overlay.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: value semantics, coroutine and Instantiate order, audio pause and loop

Translator and base library, each held by a console line compared with
dotnet or a sample trace line:
- Instantiate gives a clone its own copy of a [Serializable] class field,
  and of the elements of an array or list of them.
- Generated struct equality treats NaN fields as equal, as
  ValueType.Equals does.
- A view over a struct array hands out copies: LINQ over one saw later
  writes to the array, and ToList shared its values.
- A null out of erased code reads as default(T), for a struct and for a
  primitive: FirstOrDefault on an empty list of structs was null.
- Copying a value tuple copies a struct it holds.
- Atan2 and Atan keep the sign of zero and answer for infinities.
- Mathf.Approximately uses the relative term with a floor of eight
  epsilons; the floor of 1e-5 made everything near zero equal.

Runtime:
- WaitForFixedUpdate asked for inside a fixed step waits for the next.
- Instantiate of a child, with no parent or in world space, keeps the
  original's world position and rotation.
- Animator.Play without a time leaves a state that is playing alone.
- AudioListener.pause stops every source's clock and holds the output's
  voices; AudioSource.loop set while playing reaches the voice.

A delegate adapter does not copy a struct argument: a translated target
already copies one it writes, and the comment there says so.

Also: the prebuilt gallery workflow listed its archive into grep -q, which
failed the pipeline whenever grep left first; and hello RAM rows for two
Windows runners in the PR's perf overlay, where the suite now runs the
Unity scenes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: screenshot goldens for iOS, tvOS and Mac Catalyst

The eight gallery scenes on iOS (Metal), tvOS and Mac Catalyst, and the
TextMeshPro scene on the newest iOS runtime, which was held back until its
right-aligned line was drawn. All from CI captures.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Perf overlay: drop the Linux hello RAM row master has since rebaselined

The row moved hello RAM on Xeon Platinum 8573C from 0.732x to 0.905x
because master at the base commit measured the same. Master's base now
carries 0.876x for it at the same 20% tolerance, which this pull
request's 0.905x is inside, so the overlay no longer needs to say
anything about that row -- and saying it from the old value is what the
gate refuses.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Apple CI: one watch slice, one test server per run, one notification XCTest

The iOS screenshot legs sit at their 95 minute limit, on master as on this
branch. Measured, the screenshot suite is 7.5 minutes of it; the rest is
compiling, and two thirds of what is compiled is not the iOS app.

- The embedded watch app was built for arm64 AND x86_64 whenever the
  destination was an iPhone: 9,880 of 14,834 compile units, 21 to 34
  minutes. The CI builds now hold it to the host's slice through the
  xcconfig they already pass. The generated project is not changed.
- The screenshot test server was built by every Apple job, 3 to 10 minutes
  each. The port build makes it once and the jobs take it from the bundle,
  as Linux and Windows already do; a job without it builds it as before.
- The simulator booted ahead of the Xcode 27 leg's compile is shut down
  once the boot is proven; the test script boots it when it needs it.
- The packaging job no longer runs the local notification XCTest, which
  the native job runs from the same sources: 23 to 38 minutes of a second
  compile for the same 0.17 seconds of tests.

No timeout is raised.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: unsigned boxes, delegate types, Math.Pow, deleted-project cleanup

Review findings:

- A boxed byte, ushort, uint or ulong shared the signed type's JDK box, so
  it formatted, compared and type-tested as that type (a uint of 3000000000
  printed negative, `o is int` held for a uint). They have their own box
  classes; signed types keep the JDK's.
- Delegate.Combine and Remove throw ArgumentException for two delegates of
  different delegate types, as .NET does.
- Math.Pow agrees with .NET for negative bases with large whole exponents,
  infinities, NaN and signed zero.
- A Unity project deleted after a build takes its generated sources and
  translated classes with it, from Gradle and from Maven, instead of leaving
  them to be compiled and packaged until clean.

Found on the way:

- ParparVM's native Math.floor and Math.ceil went through a long, wrong from
  2^63 up and for NaN and infinities.
- A C# array stored in an IEnumerable local, field, element or return value
  was not wrapped, only one passed as an argument.
- Math.Truncate was missing; Math.Round lost the sign of a negative zero.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: struct arrays from generic members, null receivers, raycast layer

Review findings:

- A generic member returning an array of a struct type (List<Vector2>.ToArray,
  Enumerable.ToArray) stopped the translation; it now answers a fresh array
  of copies. List<T>.CopyTo and Array.Empty were missing.
- Int32.Equals no longer accepts a boxed enum of the same number.
- new List<T>(negative) throws ArgumentOutOfRangeException.
- value.Equals(other) on a null receiver throws NullReferenceException; the
  static object.Equals keeps its null tolerance.
- A collider on the Ignore Raycast layer neither receives mouse messages nor
  hides the collider behind it.
- A canvas whose GraphicRaycaster is disabled is not hit-tested.
- Scene roots have sibling indices that can be read and reordered.

Boxing keeps the cached boxes: Jvm.box says what differs from .NET and why
an allocation per boxing conversion is not paid for it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: enum unboxing, pause on disabled scripts, seek before Play

Review findings:

- Unboxing a boxed enum to a type of another width or signedness throws
  InvalidCastException, as .NET does; to its own underlying type, or to an
  enum of the same storage, it still succeeds, which is also what .NET does.
  `x is SomeEnum` tests the enum type rather than the storage.
- OnApplicationPause and OnApplicationFocus reach a disabled script on an
  active object.
- Random.Range(10, 0) keeps each endpoint's role and answers 1..10.
- AddComponent can construct CapsuleCollider2D, EdgeCollider2D and
  AudioSource; a test holds the registry to the components the runtime has.
- AudioSource.time set while stopped takes effect when playback begins.
- A build-settings list whose entries are all disabled or missing fails the
  build naming them, rather than starting whichever scene comes first. An
  empty list still builds every scene.
- Input.mousePresent reports the device, not whether touches simulate a
  mouse.
- StartCoroutine answers null for a routine that ends before it yields.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: static state per closed generic type, frame clock, axes, events

Review findings:

- A static field of a generic type was one Java static for every
  instantiation, so Singleton<GameManager> and Singleton<AudioManager>
  shared their instance. Each constructed type now gets its own static
  context (GenericStatics): a subclass per closed type whose class
  initializer runs the type's static constructor once, as .NET does, passed
  to static methods as a hidden last parameter and kept by instances. Forms
  that cannot be keyed fail the build naming the site.
- Time.time advances at the start of the frame, so a WaitForSeconds,
  Invoke or delayed Destroy begun in Start or a fixed step no longer counts
  the frame it was started in.
- Enum.GetName compares the value at full width instead of truncating it to
  the enum's storage.
- Key axes take gravity, sensitivity and snap from InputManager.asset.
- An animation event fires once per loop a tick crosses, in order.
- AudioSource stops every voice it started; a pitch the device cannot apply
  is a build note.

Found on the way: `instance == null` inside a generic type constrained to a
class failed bytecode verification.

The macOS translator RAM row is rebaselined from this PR's runs and four
master controls: master measured 0.68 and 0.55 on two runs of one commit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: primitive arrays to T[], string argument errors, contacts

Review findings:

- A primitive array passed where a generic member takes T[]
  (List<int>.CopyTo(int[])) failed the build. It is passed as an array of
  the right boxes and copied back after the call; List<T>.CopyTo gains its
  four-argument overload. A constructor now runs the after-call steps a
  method does.
- new string(c, negative) throws ArgumentOutOfRangeException, and the
  string members around it throw the exception types .NET does.
- A looped sound keeps its current volume, and its mute, across the
  restart at each loop.
- A collider pair touching through several contacts keeps reporting one
  of the survivors to OnCollisionStay2D until it separates.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: unbiased Range, CompareTo errors, arrays as collections

Review findings:

- Random.Range over integers redraws a sample past the last whole multiple
  of the span instead of reducing it with a biased modulo. Small spans
  almost never redraw, so seeded sequences are unchanged.
- IComparable.CompareTo throws NullReferenceException for a null receiver
  before looking at its argument, and ArgumentException for an argument of
  another type, as .NET does.
- An array viewed as ICollection<T> implements it (Count; Clear throws
  NotSupportedException, as an array does).
- UnityGameView restores Display's multi-key mode when the last view goes,
  if it was the views that turned it on.
- The unchanged-project fast path requires every part of the output it
  would otherwise write, so a partial cache is compiled again.
- GetComponentInParent skips inactive ancestors; the object itself is
  always searched.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: string receivers, listener volume, closed delegate types, axis invert

- An instance string Equals/CompareTo on a null receiver throws
  NullReferenceException; static string.Equals stays null-tolerant.
  Equals(string, StringComparison) added.
- AudioListener.volume scales every voice already playing.
- Delegates made where the closed type is known carry it, so Combine of
  Action<int> and Action<string> (or a variant Action<object>) throws as
  .NET does.
- InputManager invert is honoured for key and mouse axes.
- ContactFilter2D.ClearDepth/ClearNormalAngle keep the bounds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* perf baseline: Windows x64 AMD 26/2 stringBuilding RAM pooled from master runs

pr/6010.json set 0.175x from a single run; master's own runs 38346386877
and 38226452649 on that model measure 0.267x, as does this PR's run
38519282184.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: typeof on constructed types, delegate keys in generic code, event and clone fixes

- typeof of a constructed generic type carries its arguments, so
  typeof(List<int>) != typeof(List<string>); one cached Type per closed type.
- Delegates made in generic code that has a per-closed-type context get a
  closed type key; the remaining null-key cases are documented.
- UnityEvent skips runtime listeners whose target is destroyed and ignores
  a duplicate AddListener, as documented.
- CinemachineVirtualCamera remaps Follow/LookAt when a hierarchy is cloned.
- UnityProjectBuilder replaces every output after a step reran, and writes
  its state after install.
- InvokeRepeating comment states what the docs specify.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* perf baseline: macOS arm64 mathTranscendental RAM spans both modes

RAM is bimodal per round (~0.118x or ~0.04x); run 38536963726 had 3 of 5
rounds low and failed the gate as an improvement. Pooled with the PR's
earlier run and three master runs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: enumerator Reset, CompressBounds, particle children, raw axis, null params, pitch clamp

- List and Dictionary enumerators reset (InvalidOperationException once
  the collection changed), as .NET does.
- Tilemap bounds are kept apart from the storage and CompressBounds
  shrinks them to the occupied cells.
- Parameterless ParticleSystem Play/Stop/Pause/Clear include children.
- GetAxisRaw over same-named axes answers the largest magnitude.
- string.Concat/Format with a null array or format throw
  ArgumentNullException.
- AudioSource.pitch is clamped to [-3, 3].

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: revoice on output reinstall, canvas hit order, pitch direction; GameView host presses

- AudioSource re-creates every playing source's voice at its position
  when a different output is installed (a view shown again).
- UI raycast ranks canvases with the same keys as drawing.
- A paused (pitch 0) voice never expires; a reversed one ends at 0.
- GameView's form-level fallback starts a gesture only for a press inside
  the view; a drag or release outside still ends one begun inside.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: inactive coroutines, null argument checks, large vector text

- StartCoroutine on an object inactive in the hierarchy runs nothing and
  answers null.
- Array.Clear, Enumerable delegate overloads, Concat and ElementAt check
  their arguments before touching the source, as .NET does.
- Value types format any finite component in full (F2/F3 invariant);
  only a real infinity prints "Infinity".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: paused and detached keys, shared audio output, dead raycast hits, nested struct remap, prefs index

- Key presses made while paused or with the clock held are dropped and
  only releases pass on; a view taken off its form releases every held key.
- Detaching one of two views clears the audio output only if it is still
  that view's.
- RaycastHit2D is false once its collider is destroyed.
- Instantiate remaps Unity references inside serialized structs (fields,
  arrays, lists) instead of a plain value copy.
- PlayerPrefs.DeleteKey removes the name from the persisted index.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* perf baseline: macOS arm64 recursion RAM spans both modes

RAM is bimodal per round (~0.118x or ~0.037x), on master's runs as well
as this PR's; run 38726563387 had 2 of 3 rounds low and failed the gate
as an improvement. Pooled with five earlier macOS runs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* perf baselines: rows master's merge moved, and the Flutter JS sizes

ParparVM gate, from run 38943915665/38943916211/38943915743 (first after
merging the Flutter runtime) and this PR's earlier same-model runs:
- macOS arm64 recursion time back to ~1.235x (14 runs, master's and
  this PR's; pr/5883.json's 1.534x was one run).
- Windows arm64 d49 translator RAM 0.50x, the value before pr/5883.json
  moved it to 0.43x from one run.
- hello RAM on macOS arm64 and Windows arm64 d49, which both fell in the
  same post-merge run.
- Linux x64 EPYC 7763 translator time 0.49x.

Flutter benchmark: JavaScript executable and installed sizes, above a
baseline taken before later master merges; another PR without this one
is further above it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: trigger angle filter, checked Mathf.Abs, mass, loop remainder, detach release

- ContactFilter2D: a trigger is never filtered by the normal angle, as
  Unity documents for useTriggers.
- Mathf.Abs(int) goes through System.Math.Abs: Unity documents a
  non-negative result, which the smallest int cannot have.
- Rigidbody2D.mass refuses a value that is not positive, so the property
  and the simulation agree.
- A looping ParticleSystem keeps the time a step runs past its end and
  fires the bursts of every cycle the step crosses.
- GameView lets go of the on-screen controls and the pointer when it is
  detached in the middle of a touch.
- The Unity gallery prebuilt cache key hashes the whole plugin,
  build-engine and project-model.
- Comments record why String.Split with one null separator and the
  fixed default Random seed stay as they are.
- perf: macOS objectAllocation RAM recorded on top of #5984's row.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: mirrored UI rects, transition events, clip replacement

- RectTransform answers a positive width and height when a scale
  mirrors it, with the mirror in the scale's sign; the canvas draws it
  flipped. A negative extent failed every hit test and dropped its text.
  menu2d mirrors its play button, which still takes the click.
- Animator sends the incoming clip's events while a transition blends
  it in; they were skipped. platformer2d's Idle->Proud blend now lasts
  0.21 s and its 0.2 s event still arrives.
- Assigning AudioSource.clip stops the voice playing another clip, as
  Unity documents, so the voice and the clip that times it agree.
- perf: Windows x64 Intel model 207 recursion recorded in its upper
  mode; the row is bimodal across base folds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: mouse skips triggers, owned entry point, one-shot volume

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: one-shots in isPlaying and Pause, rawPosition origin, simulated mouse release, negative timeScale

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: disabled CanvasScaler, destroys requested during unload

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: hidden methods keep static binding, null ldvirtftn/unbox, nested particle children, no stale routing

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: rethrow keeps identity, brain rotation, destroyed particle cache, rotated and gapped tile colliders

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: deactivation stops coroutines, log-space canvas match, live Cinemachine body, particle start delay remainder

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: one-shots on a fresh output, non-loop emission ends at duration, float to ulong upper half, destroyed tilemap cache

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: JS float ties print the even digit, destroyed brain camera re-resolved, overflowing format index refused

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: early zero-delay Invoke, reparented children detach on destroy, OverlapPoint auto-sync, pitch reaches one-shots, sprite-less Image draws its color

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: typed ValueTuple Equals, value-type tuple defaults where the type arguments are known

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: .NET Exception.ToString, Single equality in RaycastHit2D, reparented tilemap re-resolves its grid, importer replaces a file that became a folder

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: nested canvas laid out by its parent, overlay canvases drawn without a camera, EPYC 7763 hello RAM row pooled

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: destroyed canvas camera falls back to overlay, bounded time scale and finite advance, importer skips links inside the project

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* GameView: a press on a host control over the view is not the game's; Unity compat: Stop rationale names its evidence

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: IEquatable keys and elements, blank constructor for serializable classes, looping emission split per cycle, ContactFilter2D float equality; GameView NOPMD

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: import record keeps names with two dots, source hashing skips linked directories

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: enabled Cinemachine body wins over a disabled one, latest-enabled camera breaks priority ties, Java-keyword C# names escaped; ScreenY direction documented

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: Array.Clear keeps erased struct arrays, per-particle random gravity, fullPathHash with the layer; SpriteRenderer never runs a frame backwards; disabled-control rationale

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: LINQ Contains asks IEquatable, base-type FindObjectsOfType includes GameObjects, scene compiler skips linked directories

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: fixed-step and particle-cycle loops end when a step makes no progress, coroutine listed before its first step, serialized ulong read unsigned

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: exact world basis for rotated children of unevenly scaled or mirrored parents, Cinemachine tracked offset in target space, cast centroid includes the collider offset

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: importer replaces a destination link and refuses backslashed record paths, hexadecimal scene floats decoded, bounded particle emission; destroy-timing rationale

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: importer refuses a linked import root, Random.Range spans past the float range, project fixed timestep sets the unscaled interval, bounded animation-event replay; sheared-sprite rationale

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: FormerlySerializedAs aliases and Unity's serialization rules in scenes, editor version symbols for scripts, UI input after fixed steps; GameView lets go on a cancelled gesture (Form.addPointerCancelledListener)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: erased struct-array Clone copies elements, dictionary enumerators keep the yielded entry; NavigationTest uninstalls its dispatcher and ResultAfterRelaunchTest starts in light mode (order-dependent CI failures)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: world rotation independent of parent scale, infinite normal-angle bounds, persistent calls pick the recorded overload and resolve asset arguments; weighted-tangent build warning

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: script fields named m_* are serialized, transposer binding mode turns the offset with the target, LoadScene accepts extensionless paths and any case

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: removed GameObject prefab overrides drop the subtree, every YAML escape decodes, negative one-shot volume is silence; the importer ignores a runtime named only in comments or dependency management

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: containers of containers are not serialized fields; Component walks pointer listeners by index (ComponentTest ConcurrentModificationException)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: stale-import cleanup never deletes through a linked folder; Component's listener walk documents why it takes no lock

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: particle cycle loop cannot stall on a tiny duration, Math.Exp keeps finite results to the true boundary, cleanup records reject only a .. component, StopCoroutine stops only its own coroutines

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Unity compat: stale install records that climb out of the classes directory are ignored when reinstalling

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* perf-baseline: the website summary leaves out an overlay that does not resolve instead of failing the Hugo build; the gate's check tests run on a throwaway tree, not the repository's overlays

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant